package class3;

import common.ListNode;
import common.ListNodeUtils;

/**
 * https://leetcode.cn/problems/odd-even-linked-list/
 * 奇偶链表
 * 将所有索引为奇数的节点和索引为偶数的节点分别组合在一起，然后返回重新排序的列表
 * 解题思路：
 * 利用双指针，做奇偶指向
 */
public class Code28_oddEvenList {
    public static void main(String[] args) {
        /**
         * 1 2 3 4 5 6 7 8
         * 1 3 5 7
         * 2 4 6 8
         * 1 3 5 7 -> 2 4 6 8
         */
        ListNode head = ListNodeUtils.getLinked(1, 2, 3, 4, 5, 6, 7, 8);
        ListNode listNode = oddEvenList(head);
        ListNodeUtils.print(listNode);
    }

    public static ListNode oddEvenList(ListNode head) {
        if (head == null) return null;
        // odd 和 even分别为奇数和偶数的尾指针
        ListNode odd = head, even = head.next, evenHead = even;
        while (even != null && even.next != null) {
            odd.next = even.next; // 将偶数的next，传给奇数的next
            odd = odd.next; // 奇数指针后移
            even.next = odd.next; // 奇数的next,传给偶数的next
            even = even.next;  // 偶数指针后移
        }
        odd.next = evenHead; // 奇数的尾节点指向 偶数头节点
        return head;
    }
}
